<?php
namespace modules\admin\form;

use idea\saf\sl\Form;
use idea\ap\Ap;
use idea\mvc\Mvc;
use idea\saf\Conf;
use helper\ErrorNo;
use helper\Util;
use library\Validator;

/**
 * Admins class file
 * admins表单管理类
 * @author 宋欢 <iphper@yeah.net>
 * @version $Id: Admins.php 1 2013-05-18 14:58:59Z huan.song $
 * @package modules.admin.form
 * @since 1.0
 */
class Admins extends Form
{
	/**
	 * @var string 管理员登录名最小长度
	 */
	const NAME_MIN_LENGTH = 6;
	
	/**
	 * @var string 管理员登录名最大长度
	 */
	const NAME_MAX_LENGTH = 12;
	
	/**
	 * @var string 管理员登录密码最小长度
	 */
	const PWD_MIN_LENGTH = 6;
	
	/**
	 * @var string 管理员登录密码最大长度
	 */
	const PWD_MAX_LENGTH = 16;
	
	/**
	 * @var string 是否激活：激活
	 */
	const USER_STATUS_Y = 'y';
	
	/**
	 * @var string 是否激活：未激活
	 */
	const USER_STATUS_N = 'n';
	
	/**
	 * @var array 寄存是否激活选项
	 */
	public static $statuses = array(
		self::USER_STATUS_Y => '激活',
		self::USER_STATUS_N => '未激活'
	);

	/**
	 * @var array 寄存表的所有字段
	 */
	protected $_attributes = array(
		'admin_id' => array(
			'label' => '管理员ID',
			'type' => 'hidden'
		),

		'admin_loginname' => array(
			'label' => '管理员登录名',
			'type' => 'text',
			'rule' => array(
				Validator::NOT_EMPTY => array(
					true,
					'请填写管理员登录名.'
				),
				Validator::MIN_LENGTH => array(
					self::NAME_MIN_LENGTH,
					'管理员登录名长度必须大于%option%个字符.'
				),
				Validator::MAX_LENGTH => array(
					self::NAME_MAX_LENGTH,
					'管理员登录名长度必须小于%option%个字符.'
				),
				Validator::UNIQUE_ADMINS_LOGINNAME => true
			)
		),

		'admin_password' => array(
			'label' => '管理员登录密码',
			'type' => 'password',
			'rule' => array(
				Validator::NOT_EMPTY => array(
					true,
					'请填写管理员登录密码.'
				),
				Validator::MIN_LENGTH => array(
					self::PWD_MIN_LENGTH,
					'管理员登录密码长度必须大于%option%个字符.'
				),
				Validator::MAX_LENGTH => array(
					self::PWD_MAX_LENGTH,
					'管理员登录密码长度必须小于%option%个字符.'
				)
			)
		),
			
		'admin_repassword' => array(
			'label' => '确认管理员登录密码',
			'type' => 'password',
			'rule' => array(
				Validator::NOT_EMPTY => array(
					true,
					'请再次填写管理员登录密码.'
				),	
				Validator::EQUAL_TO => array(
					'admin_password',
					'两次密码填写不一致.'
				)
			)
		),

		'group_id' => array(
			'label' => '所属管理组',
			'type' => 'select'
		),

		'admin_mail' => array(
			'label' => '管理员邮箱',
			'type' => 'text',
			'rule' => array(
				Validator::NOT_EMPTY => array(
					true,
					'请填写管理员邮箱，可以通过邮箱找回密码.'
				),
				Validator::MAIL => array(
					true,
					'邮箱格式不正确.'
				),
			)
		),

		'dt_registered' => array(
			'label' => '注册时间',
			'type' => 'text'
		),
			
		'ip_last_login' => array(
			'label' => '上次登录IP',
			'type' => 'text'
		),
			
		'dt_last_login' => array(
			'label' => '上次登录时间',
			'type' => 'text'
		),

		'user_status' => array(
			'label' => '激活',
			'type' => 'radio',
			'rule' => array(
				Validator::IN_ARRAY => array(
					array(
						self::USER_STATUS_Y,
						self::USER_STATUS_N
					),
					'请选择是否激活选项'
				),
			)
		)
	);
	
	/**
	 * 获取是否激活字段表单元素
	 * @return array
	 */
	public function getGroupIdOptions()
	{
		return Util::getForm('AdminsGroups', 'admin')->getGroupsOptions();
	}
	
	/**
	 * 获取是否激活字段表单元素
	 * @return array
	 */
	public function getUserStatusOptions()
	{
		return $this->getOptions(self::$statuses);
	}
	
	/**
	 * 通过是否激活选项，获取是否激活描述
	 * @param string $value
	 * @return string
	 */
	public function getUserStatusLabel($value)
	{
		return isset(self::$statuses[$value]) ? self::$statuses[$value] : '';
	}

	/**
	 * 通过管理员ID获取管理员名
	 * @param integer $value
	 * @return string
	 */
	public function getLoginNameById($value)
	{
		$ret = $this->getService()->getByPk('admin_loginname', $value);
		if ($ret['err_no'] !== ErrorNo::SUCCESS_NUM) {
			return '';
		}

		return $ret['admin_loginname'];
	}

	/**
	 * 通过管理员ID获取管理员权限
	 * @param integer $value
	 * @return string
	 */
	public function getAuthById($value)
	{
		$ret = $this->getService()->getByPk('group_id', $value);
		if ($ret['err_no'] !== ErrorNo::SUCCESS_NUM) {
			return '';
		}

		return Util::getForm('AdminsGroups', 'admin')->getAuthById($ret['group_id']);
	}

	/**
	 * 通过管理员ID判断管理员是否有权限
	 * @param integer $value
	 * @return boolean
	 */
	public function hasAuthById($value)
	{
		$auths = self::getAuthById($value);
		if ($auths === 'ALL') {
			return true;
		}

		$module = Mvc::$module;
		$controller = Mvc::$controller;
		$action = (substr(Mvc::$action, -7) === '_submit') ? substr(Mvc::$action, 0, -7) : Mvc::$action;
		$conf = Conf::getAppConf('auths');
		if (!isset($conf[$module][$controller][$action])) {
			return true;
		}

		$auths = ',' . $auths . ',';
		$router = ',' . $module . '-' . $controller . '-' . $action . ',';
		if (strpos($auths, $router) !== false) {
			return true;
		}

		return false;
	}
}
